﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplicationGDI2._1
{
    public partial class Form1 : Form
    {
        HatchStyle hs;        

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics grp = e.Graphics;

            Pen p = new Pen(Color.DimGray);

            float[] dv = { 5, 2, 5, 2 };
            p.Width = 3;
            p.DashPattern = dv;
            grp.DrawLine(p, new Point(180, 250), new Point(310, 300));  // низ линия основная
            grp.DrawLine(p, new Point(310, 300), new Point(430, 150));  // Правая основная
            grp.DrawLine(p, new Point(430, 150), new Point(300, 100));  // верхняя основная
            grp.DrawLine(p, new Point(180, 250), new Point(300, 100));  // левая основная
            grp.DrawLine(p, new Point(343, 260), new Point(430, 300));  // нижняя правая дополнительная
            grp.DrawLine(p, new Point(395, 198), new Point(482, 238));  // нижняя левая дополнительная
            grp.DrawLine(p, new Point(364, 125), new Point(425, 45));  // верхняя доп линия
            grp.DrawLine(p, new Point(394, 88), new Point(350, 70));  // верхняя отходящая от доп линии
            grp.DrawLine(p, new Point(210, 263), new Point(160, 330));  // нижняя доп линия
            grp.DrawLine(p, new Point(170, 316), new Point(120, 296));  // нижняя отходящая от доп линии
            grp.DrawLine(p, new Point(210, 210), new Point(150, 186));  // левая нижняя доп линия
            grp.DrawLine(p, new Point(250, 160), new Point(200, 136));  // левая верхняя доп линия
            grp.DrawLine(p, new Point(210, 140), new Point(190, 166));  // левая отходящая от верхней доп линии
            grp.DrawLine(p, new Point(180, 200), new Point(207, 164));  // левая отходящая от нижней доп линии
            grp.DrawLine(p, new Point(180, 156), new Point(220, 175));  // пересекающая между левыми отходящими от доп

            // рисуем лесной массив в центре
            //Brush b = new HatchBrush(hs, Color.Silver, Color.Green);
            //int x = 289, y = 131;
            p.Width = 70;
            //grp.DrawLine(p,  new Point(260, 250), new Point(350, 150));
            Point[] pArr = new Point[5];
            float[] v = {1};
            p.DashPattern = v;

            Point[] fillLine = new Point[5];
            fillLine[0] = new Point(310, 117);
            fillLine[1] = new Point(396, 154);
            fillLine[2] = new Point(312, 259);
            fillLine[3] = new Point(225, 224);
            fillLine[4] = new Point(310, 100);

            pArr[0] = new Point(300, 150);
            pArr[1] = new Point(340, 167);
            pArr[2] = new Point(300, 217);
            pArr[3] = new Point(280, 209);
            pArr[4] = new Point(338, 137);

            grp.DrawLines(p, pArr);
            Brush b = new HatchBrush(HatchStyle.Shingle, Color.Gold, Color.Green);

            Point[] house1 = new Point[13];
            house1[0] = new Point(213, 285);
            house1[1] = new Point(214, 284);
            house1[2] = new Point(215, 286);
            house1[3] = new Point(285, 310);
            house1[4] = new Point(286, 311);
            house1[5] = new Point(284, 309);
            house1[6] = new Point(270, 350);
            house1[7] = new Point(269, 351);
            house1[8] = new Point(268, 349);
            house1[9] = new Point(200, 315);
            house1[10] = new Point(199, 314);
            house1[11] = new Point(200, 313);
            house1[12] = new Point(213, 285);

            Brush b1 = new HatchBrush(HatchStyle.HorizontalBrick, Color.Red, Color.Gray);
            grp.FillClosedCurve(b1, house1);
            grp.FillClosedCurve(b, fillLine);
            /*
            SolidBrush sb1 = new SolidBrush(Color.Green);
            Font f = new Font("Georgia", 14);
            grp.DrawString("10a", f, sb1, new Rectangle());
             */
            // Create string to draw.
            string txt = "10a";
            float alpha = 70.0f;
            float alpha1 = 72;
            int fontSize = 20;
            Point center = new Point(220, 318);

            // Vertical text:
            FontFamily ff = new FontFamily("Georgia");
            Font f = new Font(ff, fontSize, FontStyle.Regular);
            StringFormat sf = new StringFormat();
            sf.FormatFlags = StringFormatFlags.DirectionVertical;

            // Global shift of the origin:
            grp.TranslateTransform(center.X, center.Y);  // X + fontSize/2
            grp.RotateTransform(-alpha);  // anticlockwise
            grp.DrawString(txt, f, new SolidBrush(Color.Black), 0, 0, sf);
            //-------------------------------------------------------------------------

            grp.TranslateTransform(50, -140);
            grp.RotateTransform(-alpha1);
            grp.DrawString("Derebasovskii massiv", f, b1, 0, 0, sf);

            grp.Dispose();

        }

        private void Form1_Click(object sender, EventArgs e)
        {
            textBox1.Text = ((e as MouseEventArgs).X + " " + (e as MouseEventArgs).Y);
        }

        void en_onChanged(WindowsFormsApplicationGDI2._1.Enumeration.Enumer sender, object value)
        {
            
            hs = (HatchStyle)value; // полю нашего класса присваиваем пришедшее значение
            
            Invalidate();   // и перерисовываем
        }

        //private void Form1_Load(object sender, EventArgs e)
        //{
        //    WindowsFormsApplicationGDI2._1.Enumeration.Enumer en = new WindowsFormsApplicationGDI2._1.Enumeration.Enumer(
        //        typeof(HatchStyle), this);

        //    en.onChanged += en_onChanged;
        //}
    }
}

/*
 * Нарисовать схему проезда.
 * Градиентный прямоугольник, со сторокой.
 * заборы или реки - реализовать с помощью хатчбраш.
 * дорогу  - дашпатерн.
 * текстурной кистью - что-ьто отметить. 
 * лесной массив с помощью ратчградбраш
*/